# Python 使用 open() 函数创建或打开文件，语法格式如下所示：
#
#  open(file, mode='r', buffering=-1, encoding=None, errors=None, newline=None, closefd=True, opener=None)
# 参数说明如下所示：
# ● file：表示将要打开的文件的路径，也可以是要被封装的整数类型文件描述符。
# ● mode：是一个可选字符串，用于指定打开文件的模式，默认值是 'r'（以文本模式打开并读取）。可选模式如下：
#
# ff = open('test.txt', 'w', encoding='utf-8')
# 上面我们创建的文件 test.txt 没有任何内容，我们向这个文件中写入一些信息，对于写操作，Python 文件对象提供了两个函数，如下所示：
# 函数	描述
# write(str)	将字符串写入文件，返回写入字符长度
# ff.write('hello world')
# # writelines(s)	向文件写入一个字符串列表
# ff.writelines(['hello world', 'hello python'])
# ff.close()
# 上面我们使用了 close() 函数进行关闭操作，如果打开的文件忘记了关闭，
# 可能会对程序造成一些隐患，为了避免这个问题的出现，可以使用 with as 语句，
# 通过这种方式，程序执行完成后会自动关闭已经打开的文件。如下所示：

# with open('test.txt', 'w', encoding='utf-8') as ff:
#
#     ff.write('hello world' + '\n')
#     ff.writelines(['hello world', '   hello python'])

#     2.3 读取
# 之前我们已经向文件中写入了一些内容，现在我们读取一下，对于文件的读操作，Python 文件对象提供了三个函数，如下所示：
# 函数	描述

# readline()	读取一行
# readlines()	读取所有行并返回列表
with open('test.txt', 'r', encoding='utf-8') as ff:
    # 读取指定字节数
    # read(size)	读取指定的字节数，参数可选，无参或参数为负时读取所有
    # print(ff.read(-1))
    # 读取一行
    # print(ff.readline())
    # # 读取所有行并返回列表
    print(ff.readlines())

#     Python 提供了两个与文件对象位置相关的函数，如下所示：
# 函数	描述
# tell()	返回文件对象在文件中的当前位置
# file.seek(offset[, whence])
# 将文件对象移动到指定的位置；offset 表示移动的偏移量；
# whence 为可选参数，值为 0 表示从文件开头起算（默认值）、
# 值为 1 表示使用当前文件位置、值为 2 表示使用文件末尾作为参考点
with open('test.txt', 'r+') as ff:
    ff.write("123456")
    # ，ff.tell() == 0 表明文件操作正处于文件的开头，
    # 还没有读取或写入过任何数据，或者已经恢复到初始状态。
    # 在处理文件时，这通常是开始进行读取或写入操作前的默认位置。
    # print(ff.tell())
    # ff.seek(3)
    # print(ff.read(2))
    # print(ff.tell())
    # 移动到倒数第二个字节
    # ff.seek(-2, 2)
    # print(ff.tell())
    # print(ff.read(1))

    #   截取两个字节
    ff.truncate(3)
    print(ff.read())
    # 检测文件对象是否连接到终端设备
    print(ff.isatty())
with open('test.txt', 'a', encoding='utf-8') as fs:
    fs.write("aaaaaaaa")
import linecache
print(linecache.getline("test.txt", 1))


print("****"*20)
# >>> import csv

# ...
# Eric Idle
# John Cleese
import csv

import csv
with open('eggs.csv', 'w', newline='') as csvfile:
    spamwriter = csv.writer(csvfile, delimiter=' ',
                            quotechar='|', quoting=csv.QUOTE_MINIMAL)
    spamwriter.writerow(['Spam'] * 5 + ['Baked Beans'])
    spamwriter.writerow(['Spam', 'Lovely Spam', 'Wonderful Spam'])
